{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\"http://hilpisch.com/tpq_logo.png\" alt=\"The Python Quants\" width=\"35%\" align=\"right\" border=\"0\"><br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Python for Finance (2nd ed.)\n",
    "\n",
    "**Mastering Data-Driven Finance**\n",
    "\n",
    "&copy; Dr. Yves J. Hilpisch | The Python Quants GmbH\n",
    "\n",
    "<img src=\"http://hilpisch.com/images/py4fi_2nd_shadow.png\" width=\"300px\" align=\"left\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Data Analysis with pandas"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## pandas Basics"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### First Steps with DataFrame Class"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "uuid": "eda2a742-134d-4d47-8b30-557b846b9bb3"
   },
   "outputs": [],
   "source": [
    "import pandas as pd  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.DataFrame([10, 20, 30, 40],  \n",
    "                  columns=['numbers'],  \n",
    "                  index=['a', 'b', 'c', 'd'])  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "uuid": "f3be2d89-829a-49b2-96fc-07c475db1e3f"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>numbers</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>40</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   numbers\n",
       "a       10\n",
       "b       20\n",
       "c       30\n",
       "d       40"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "uuid": "47b70a7b-710f-4c40-9a70-b09db7af1a12"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['a', 'b', 'c', 'd'], dtype='object')"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.index  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "uuid": "a36c6695-520d-4df1-a6fa-5f8362af37a3"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['numbers'], dtype='object')"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.columns  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "uuid": "c93aed37-21de-429d-86ed-9849e4c3e23c"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "numbers    30\n",
       "Name: c, dtype: int64"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.loc['c']  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "uuid": "8c7c2f69-3673-40d9-a568-0471c629810d"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>numbers</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>40</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   numbers\n",
       "a       10\n",
       "d       40"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.loc[['a', 'd']]  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "uuid": "c3ce0cc3-26e8-4256-ab8c-9a2d4b181633"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>numbers</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   numbers\n",
       "b       20\n",
       "c       30"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.iloc[1:3]  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "uuid": "94b1d846-63df-49f4-8a7f-8fed03e5f4fa"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "numbers    100\n",
       "dtype: int64"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.sum()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "uuid": "4e73eb4f-352d-4527-b0c5-4f3a6e7eb354"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>numbers</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>400</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>900</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>1600</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   numbers\n",
       "a      100\n",
       "b      400\n",
       "c      900\n",
       "d     1600"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.apply(lambda x: x ** 2)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "uuid": "75206a83-0154-4be2-88d0-7a82a190fda1"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>numbers</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>400</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>900</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>1600</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   numbers\n",
       "a      100\n",
       "b      400\n",
       "c      900\n",
       "d     1600"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df ** 2  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "df['floats'] = (1.5, 2.5, 3.5, 4.5)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "uuid": "49a2633a-b3c0-4d00-a227-e0ff4a8cf81d"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>numbers</th>\n",
       "      <th>floats</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>10</td>\n",
       "      <td>1.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>20</td>\n",
       "      <td>2.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>30</td>\n",
       "      <td>3.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>40</td>\n",
       "      <td>4.5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   numbers  floats\n",
       "a       10     1.5\n",
       "b       20     2.5\n",
       "c       30     3.5\n",
       "d       40     4.5"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "uuid": "c49b9aea-417a-4c2b-8e27-0e8771a77c87"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a    1.5\n",
       "b    2.5\n",
       "c    3.5\n",
       "d    4.5\n",
       "Name: floats, dtype: float64"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['floats']  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "df['names'] = pd.DataFrame(['Yves', 'Sandra', 'Lilli', 'Henry'],\n",
    "                           index=['d', 'a', 'b', 'c'])  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "uuid": "aa892c41-6637-45ed-876b-6a70285e4c0b"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>numbers</th>\n",
       "      <th>floats</th>\n",
       "      <th>names</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>10</td>\n",
       "      <td>1.5</td>\n",
       "      <td>Sandra</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>20</td>\n",
       "      <td>2.5</td>\n",
       "      <td>Lilli</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>30</td>\n",
       "      <td>3.5</td>\n",
       "      <td>Henry</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>40</td>\n",
       "      <td>4.5</td>\n",
       "      <td>Yves</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   numbers  floats   names\n",
       "a       10     1.5  Sandra\n",
       "b       20     2.5   Lilli\n",
       "c       30     3.5   Henry\n",
       "d       40     4.5    Yves"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "uuid": "584ac18c-161f-4c7b-8ff1-1cd406fb8437"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>numbers</th>\n",
       "      <th>floats</th>\n",
       "      <th>names</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10</td>\n",
       "      <td>1.50</td>\n",
       "      <td>Sandra</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>20</td>\n",
       "      <td>2.50</td>\n",
       "      <td>Lilli</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>30</td>\n",
       "      <td>3.50</td>\n",
       "      <td>Henry</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>40</td>\n",
       "      <td>4.50</td>\n",
       "      <td>Yves</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>100</td>\n",
       "      <td>5.75</td>\n",
       "      <td>Jil</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   numbers  floats   names\n",
       "0       10    1.50  Sandra\n",
       "1       20    2.50   Lilli\n",
       "2       30    3.50   Henry\n",
       "3       40    4.50    Yves\n",
       "4      100    5.75     Jil"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.append({'numbers': 100, 'floats': 5.75, 'names': 'Jil'},\n",
    "               ignore_index=True)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = df.append(pd.DataFrame({'numbers': 100, 'floats': 5.75,\n",
    "                             'names': 'Jil'}, index=['y',]))  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "uuid": "9068cd04-c6ff-4d0c-bd52-cf04cd89a0e9"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>numbers</th>\n",
       "      <th>floats</th>\n",
       "      <th>names</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>10</td>\n",
       "      <td>1.50</td>\n",
       "      <td>Sandra</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>20</td>\n",
       "      <td>2.50</td>\n",
       "      <td>Lilli</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>30</td>\n",
       "      <td>3.50</td>\n",
       "      <td>Henry</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>40</td>\n",
       "      <td>4.50</td>\n",
       "      <td>Yves</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>y</th>\n",
       "      <td>100</td>\n",
       "      <td>5.75</td>\n",
       "      <td>Jil</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   numbers  floats   names\n",
       "a       10    1.50  Sandra\n",
       "b       20    2.50   Lilli\n",
       "c       30    3.50   Henry\n",
       "d       40    4.50    Yves\n",
       "y      100    5.75     Jil"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = df.append(pd.DataFrame({'names': 'Liz'}, index=['z',]), sort=False)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "uuid": "9068cd04-c6ff-4d0c-bd52-cf04cd89a0e9"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>numbers</th>\n",
       "      <th>floats</th>\n",
       "      <th>names</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>10.0</td>\n",
       "      <td>1.50</td>\n",
       "      <td>Sandra</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>20.0</td>\n",
       "      <td>2.50</td>\n",
       "      <td>Lilli</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>30.0</td>\n",
       "      <td>3.50</td>\n",
       "      <td>Henry</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>40.0</td>\n",
       "      <td>4.50</td>\n",
       "      <td>Yves</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>y</th>\n",
       "      <td>100.0</td>\n",
       "      <td>5.75</td>\n",
       "      <td>Jil</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>z</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Liz</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   numbers  floats   names\n",
       "a     10.0    1.50  Sandra\n",
       "b     20.0    2.50   Lilli\n",
       "c     30.0    3.50   Henry\n",
       "d     40.0    4.50    Yves\n",
       "y    100.0    5.75     Jil\n",
       "z      NaN     NaN     Liz"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "numbers    float64\n",
       "floats     float64\n",
       "names       object\n",
       "dtype: object"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.dtypes  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "uuid": "3e863c7f-7875-4911-997b-6e48123dc1e5"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "numbers    40.00\n",
       "floats      3.55\n",
       "dtype: float64"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[['numbers', 'floats']].mean()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "uuid": "c52173a0-485d-4eb2-b6b4-407d1ff2c30e"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "numbers    35.355339\n",
       "floats      1.662077\n",
       "dtype: float64"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[['numbers', 'floats']].std()  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Second Steps with DataFrame Class"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "a = np.random.standard_normal((9, 4))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "uuid": "d6f56a00-91e6-4221-a1ec-6093f416d1be"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-1.74976547,  0.3426804 ,  1.1530358 , -0.25243604],\n",
       "       [ 0.98132079,  0.51421884,  0.22117967, -1.07004333],\n",
       "       [-0.18949583,  0.25500144, -0.45802699,  0.43516349],\n",
       "       [-0.58359505,  0.81684707,  0.67272081, -0.10441114],\n",
       "       [-0.53128038,  1.02973269, -0.43813562, -1.11831825],\n",
       "       [ 1.61898166,  1.54160517, -0.25187914, -0.84243574],\n",
       "       [ 0.18451869,  0.9370822 ,  0.73100034,  1.36155613],\n",
       "       [-0.32623806,  0.05567601,  0.22239961, -1.443217  ],\n",
       "       [-0.75635231,  0.81645401,  0.75044476, -0.45594693]])"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.DataFrame(a)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "uuid": "450bd14d-7668-4f3f-a863-966f13562818"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-1.749765</td>\n",
       "      <td>0.342680</td>\n",
       "      <td>1.153036</td>\n",
       "      <td>-0.252436</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.981321</td>\n",
       "      <td>0.514219</td>\n",
       "      <td>0.221180</td>\n",
       "      <td>-1.070043</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.189496</td>\n",
       "      <td>0.255001</td>\n",
       "      <td>-0.458027</td>\n",
       "      <td>0.435163</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.583595</td>\n",
       "      <td>0.816847</td>\n",
       "      <td>0.672721</td>\n",
       "      <td>-0.104411</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-0.531280</td>\n",
       "      <td>1.029733</td>\n",
       "      <td>-0.438136</td>\n",
       "      <td>-1.118318</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>1.618982</td>\n",
       "      <td>1.541605</td>\n",
       "      <td>-0.251879</td>\n",
       "      <td>-0.842436</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>0.184519</td>\n",
       "      <td>0.937082</td>\n",
       "      <td>0.731000</td>\n",
       "      <td>1.361556</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>-0.326238</td>\n",
       "      <td>0.055676</td>\n",
       "      <td>0.222400</td>\n",
       "      <td>-1.443217</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>-0.756352</td>\n",
       "      <td>0.816454</td>\n",
       "      <td>0.750445</td>\n",
       "      <td>-0.455947</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          0         1         2         3\n",
       "0 -1.749765  0.342680  1.153036 -0.252436\n",
       "1  0.981321  0.514219  0.221180 -1.070043\n",
       "2 -0.189496  0.255001 -0.458027  0.435163\n",
       "3 -0.583595  0.816847  0.672721 -0.104411\n",
       "4 -0.531280  1.029733 -0.438136 -1.118318\n",
       "5  1.618982  1.541605 -0.251879 -0.842436\n",
       "6  0.184519  0.937082  0.731000  1.361556\n",
       "7 -0.326238  0.055676  0.222400 -1.443217\n",
       "8 -0.756352  0.816454  0.750445 -0.455947"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "df.columns = ['No1', 'No2', 'No3', 'No4']  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "uuid": "968395a4-12bc-46d2-b486-6c767abce366"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>No1</th>\n",
       "      <th>No2</th>\n",
       "      <th>No3</th>\n",
       "      <th>No4</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-1.749765</td>\n",
       "      <td>0.342680</td>\n",
       "      <td>1.153036</td>\n",
       "      <td>-0.252436</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.981321</td>\n",
       "      <td>0.514219</td>\n",
       "      <td>0.221180</td>\n",
       "      <td>-1.070043</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.189496</td>\n",
       "      <td>0.255001</td>\n",
       "      <td>-0.458027</td>\n",
       "      <td>0.435163</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.583595</td>\n",
       "      <td>0.816847</td>\n",
       "      <td>0.672721</td>\n",
       "      <td>-0.104411</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-0.531280</td>\n",
       "      <td>1.029733</td>\n",
       "      <td>-0.438136</td>\n",
       "      <td>-1.118318</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>1.618982</td>\n",
       "      <td>1.541605</td>\n",
       "      <td>-0.251879</td>\n",
       "      <td>-0.842436</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>0.184519</td>\n",
       "      <td>0.937082</td>\n",
       "      <td>0.731000</td>\n",
       "      <td>1.361556</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>-0.326238</td>\n",
       "      <td>0.055676</td>\n",
       "      <td>0.222400</td>\n",
       "      <td>-1.443217</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>-0.756352</td>\n",
       "      <td>0.816454</td>\n",
       "      <td>0.750445</td>\n",
       "      <td>-0.455947</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        No1       No2       No3       No4\n",
       "0 -1.749765  0.342680  1.153036 -0.252436\n",
       "1  0.981321  0.514219  0.221180 -1.070043\n",
       "2 -0.189496  0.255001 -0.458027  0.435163\n",
       "3 -0.583595  0.816847  0.672721 -0.104411\n",
       "4 -0.531280  1.029733 -0.438136 -1.118318\n",
       "5  1.618982  1.541605 -0.251879 -0.842436\n",
       "6  0.184519  0.937082  0.731000  1.361556\n",
       "7 -0.326238  0.055676  0.222400 -1.443217\n",
       "8 -0.756352  0.816454  0.750445 -0.455947"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "uuid": "68e8d73f-93d3-47ac-a656-1edbdebcd1ff"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7010330941456459"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['No2'].mean()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "dates = pd.date_range('2019-1-1', periods=9, freq='M')  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "uuid": "a80e1e88-d211-4ee4-a6d3-90403a7739a8"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DatetimeIndex(['2019-01-31', '2019-02-28', '2019-03-31', '2019-04-30',\n",
       "               '2019-05-31', '2019-06-30', '2019-07-31', '2019-08-31',\n",
       "               '2019-09-30'],\n",
       "              dtype='datetime64[ns]', freq='M')"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dates"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "df.index = dates"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "uuid": "d8fef9ed-25ca-4ae0-bd0c-026d340a903b"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>No1</th>\n",
       "      <th>No2</th>\n",
       "      <th>No3</th>\n",
       "      <th>No4</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2019-01-31</th>\n",
       "      <td>-1.749765</td>\n",
       "      <td>0.342680</td>\n",
       "      <td>1.153036</td>\n",
       "      <td>-0.252436</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-28</th>\n",
       "      <td>0.981321</td>\n",
       "      <td>0.514219</td>\n",
       "      <td>0.221180</td>\n",
       "      <td>-1.070043</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-03-31</th>\n",
       "      <td>-0.189496</td>\n",
       "      <td>0.255001</td>\n",
       "      <td>-0.458027</td>\n",
       "      <td>0.435163</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-04-30</th>\n",
       "      <td>-0.583595</td>\n",
       "      <td>0.816847</td>\n",
       "      <td>0.672721</td>\n",
       "      <td>-0.104411</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-31</th>\n",
       "      <td>-0.531280</td>\n",
       "      <td>1.029733</td>\n",
       "      <td>-0.438136</td>\n",
       "      <td>-1.118318</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-06-30</th>\n",
       "      <td>1.618982</td>\n",
       "      <td>1.541605</td>\n",
       "      <td>-0.251879</td>\n",
       "      <td>-0.842436</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-07-31</th>\n",
       "      <td>0.184519</td>\n",
       "      <td>0.937082</td>\n",
       "      <td>0.731000</td>\n",
       "      <td>1.361556</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-08-31</th>\n",
       "      <td>-0.326238</td>\n",
       "      <td>0.055676</td>\n",
       "      <td>0.222400</td>\n",
       "      <td>-1.443217</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-09-30</th>\n",
       "      <td>-0.756352</td>\n",
       "      <td>0.816454</td>\n",
       "      <td>0.750445</td>\n",
       "      <td>-0.455947</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 No1       No2       No3       No4\n",
       "2019-01-31 -1.749765  0.342680  1.153036 -0.252436\n",
       "2019-02-28  0.981321  0.514219  0.221180 -1.070043\n",
       "2019-03-31 -0.189496  0.255001 -0.458027  0.435163\n",
       "2019-04-30 -0.583595  0.816847  0.672721 -0.104411\n",
       "2019-05-31 -0.531280  1.029733 -0.438136 -1.118318\n",
       "2019-06-30  1.618982  1.541605 -0.251879 -0.842436\n",
       "2019-07-31  0.184519  0.937082  0.731000  1.361556\n",
       "2019-08-31 -0.326238  0.055676  0.222400 -1.443217\n",
       "2019-09-30 -0.756352  0.816454  0.750445 -0.455947"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "uuid": "bcc38d60-3e1c-49bb-b883-ea7564c136b4"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-1.74976547,  0.3426804 ,  1.1530358 , -0.25243604],\n",
       "       [ 0.98132079,  0.51421884,  0.22117967, -1.07004333],\n",
       "       [-0.18949583,  0.25500144, -0.45802699,  0.43516349],\n",
       "       [-0.58359505,  0.81684707,  0.67272081, -0.10441114],\n",
       "       [-0.53128038,  1.02973269, -0.43813562, -1.11831825],\n",
       "       [ 1.61898166,  1.54160517, -0.25187914, -0.84243574],\n",
       "       [ 0.18451869,  0.9370822 ,  0.73100034,  1.36155613],\n",
       "       [-0.32623806,  0.05567601,  0.22239961, -1.443217  ],\n",
       "       [-0.75635231,  0.81645401,  0.75044476, -0.45594693]])"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "uuid": "bcc38d60-3e1c-49bb-b883-ea7564c136b4"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-1.74976547,  0.3426804 ,  1.1530358 , -0.25243604],\n",
       "       [ 0.98132079,  0.51421884,  0.22117967, -1.07004333],\n",
       "       [-0.18949583,  0.25500144, -0.45802699,  0.43516349],\n",
       "       [-0.58359505,  0.81684707,  0.67272081, -0.10441114],\n",
       "       [-0.53128038,  1.02973269, -0.43813562, -1.11831825],\n",
       "       [ 1.61898166,  1.54160517, -0.25187914, -0.84243574],\n",
       "       [ 0.18451869,  0.9370822 ,  0.73100034,  1.36155613],\n",
       "       [-0.32623806,  0.05567601,  0.22239961, -1.443217  ],\n",
       "       [-0.75635231,  0.81645401,  0.75044476, -0.45594693]])"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.array(df)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Basic Analytics"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "DatetimeIndex: 9 entries, 2019-01-31 to 2019-09-30\n",
      "Freq: M\n",
      "Data columns (total 4 columns):\n",
      " #   Column  Non-Null Count  Dtype  \n",
      "---  ------  --------------  -----  \n",
      " 0   No1     9 non-null      float64\n",
      " 1   No2     9 non-null      float64\n",
      " 2   No3     9 non-null      float64\n",
      " 3   No4     9 non-null      float64\n",
      "dtypes: float64(4)\n",
      "memory usage: 360.0 bytes\n"
     ]
    }
   ],
   "source": [
    "df.info()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "uuid": "125980cc-91ec-4ab4-9a4a-cfd772dd1254"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>No1</th>\n",
       "      <th>No2</th>\n",
       "      <th>No3</th>\n",
       "      <th>No4</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>9.000000</td>\n",
       "      <td>9.000000</td>\n",
       "      <td>9.000000</td>\n",
       "      <td>9.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>-0.150212</td>\n",
       "      <td>0.701033</td>\n",
       "      <td>0.289193</td>\n",
       "      <td>-0.387788</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>0.988306</td>\n",
       "      <td>0.457685</td>\n",
       "      <td>0.579920</td>\n",
       "      <td>0.877532</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>-1.749765</td>\n",
       "      <td>0.055676</td>\n",
       "      <td>-0.458027</td>\n",
       "      <td>-1.443217</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>-0.583595</td>\n",
       "      <td>0.342680</td>\n",
       "      <td>-0.251879</td>\n",
       "      <td>-1.070043</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>-0.326238</td>\n",
       "      <td>0.816454</td>\n",
       "      <td>0.222400</td>\n",
       "      <td>-0.455947</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>0.184519</td>\n",
       "      <td>0.937082</td>\n",
       "      <td>0.731000</td>\n",
       "      <td>-0.104411</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>1.618982</td>\n",
       "      <td>1.541605</td>\n",
       "      <td>1.153036</td>\n",
       "      <td>1.361556</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            No1       No2       No3       No4\n",
       "count  9.000000  9.000000  9.000000  9.000000\n",
       "mean  -0.150212  0.701033  0.289193 -0.387788\n",
       "std    0.988306  0.457685  0.579920  0.877532\n",
       "min   -1.749765  0.055676 -0.458027 -1.443217\n",
       "25%   -0.583595  0.342680 -0.251879 -1.070043\n",
       "50%   -0.326238  0.816454  0.222400 -0.455947\n",
       "75%    0.184519  0.937082  0.731000 -0.104411\n",
       "max    1.618982  1.541605  1.153036  1.361556"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.describe()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "uuid": "f760ea25-c64c-4e70-9f91-b72701d919ce"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "No1   -1.351906\n",
       "No2    6.309298\n",
       "No3    2.602739\n",
       "No4   -3.490089\n",
       "dtype: float64"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.sum()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "uuid": "3dd9bd77-eb80-46cb-87f3-62c053a8e223"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "No1   -0.150212\n",
       "No2    0.701033\n",
       "No3    0.289193\n",
       "No4   -0.387788\n",
       "dtype: float64"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.mean()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "uuid": "3dd9bd77-eb80-46cb-87f3-62c053a8e223"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "No1   -0.150212\n",
       "No2    0.701033\n",
       "No3    0.289193\n",
       "No4   -0.387788\n",
       "dtype: float64"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.mean(axis=0)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2019-01-31   -0.126621\n",
       "2019-02-28    0.161669\n",
       "2019-03-31    0.010661\n",
       "2019-04-30    0.200390\n",
       "2019-05-31   -0.264500\n",
       "2019-06-30    0.516568\n",
       "2019-07-31    0.803539\n",
       "2019-08-31   -0.372845\n",
       "2019-09-30    0.088650\n",
       "Freq: M, dtype: float64"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.mean(axis=1)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "uuid": "8e167ea8-09b7-4585-8cac-28fe20eefe66"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>No1</th>\n",
       "      <th>No2</th>\n",
       "      <th>No3</th>\n",
       "      <th>No4</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2019-01-31</th>\n",
       "      <td>-1.749765</td>\n",
       "      <td>0.342680</td>\n",
       "      <td>1.153036</td>\n",
       "      <td>-0.252436</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-28</th>\n",
       "      <td>-0.768445</td>\n",
       "      <td>0.856899</td>\n",
       "      <td>1.374215</td>\n",
       "      <td>-1.322479</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-03-31</th>\n",
       "      <td>-0.957941</td>\n",
       "      <td>1.111901</td>\n",
       "      <td>0.916188</td>\n",
       "      <td>-0.887316</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-04-30</th>\n",
       "      <td>-1.541536</td>\n",
       "      <td>1.928748</td>\n",
       "      <td>1.588909</td>\n",
       "      <td>-0.991727</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-31</th>\n",
       "      <td>-2.072816</td>\n",
       "      <td>2.958480</td>\n",
       "      <td>1.150774</td>\n",
       "      <td>-2.110045</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-06-30</th>\n",
       "      <td>-0.453834</td>\n",
       "      <td>4.500086</td>\n",
       "      <td>0.898895</td>\n",
       "      <td>-2.952481</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-07-31</th>\n",
       "      <td>-0.269316</td>\n",
       "      <td>5.437168</td>\n",
       "      <td>1.629895</td>\n",
       "      <td>-1.590925</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-08-31</th>\n",
       "      <td>-0.595554</td>\n",
       "      <td>5.492844</td>\n",
       "      <td>1.852294</td>\n",
       "      <td>-3.034142</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-09-30</th>\n",
       "      <td>-1.351906</td>\n",
       "      <td>6.309298</td>\n",
       "      <td>2.602739</td>\n",
       "      <td>-3.490089</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 No1       No2       No3       No4\n",
       "2019-01-31 -1.749765  0.342680  1.153036 -0.252436\n",
       "2019-02-28 -0.768445  0.856899  1.374215 -1.322479\n",
       "2019-03-31 -0.957941  1.111901  0.916188 -0.887316\n",
       "2019-04-30 -1.541536  1.928748  1.588909 -0.991727\n",
       "2019-05-31 -2.072816  2.958480  1.150774 -2.110045\n",
       "2019-06-30 -0.453834  4.500086  0.898895 -2.952481\n",
       "2019-07-31 -0.269316  5.437168  1.629895 -1.590925\n",
       "2019-08-31 -0.595554  5.492844  1.852294 -3.034142\n",
       "2019-09-30 -1.351906  6.309298  2.602739 -3.490089"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.cumsum()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "No1   -0.150212\n",
       "No2    0.701033\n",
       "No3    0.289193\n",
       "No4   -0.387788\n",
       "dtype: float64"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.mean(df)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/yves/Python/lib/python3.7/site-packages/ipykernel_launcher.py:2: RuntimeWarning: invalid value encountered in log\n",
      "  \n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>No1</th>\n",
       "      <th>No2</th>\n",
       "      <th>No3</th>\n",
       "      <th>No4</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2019-01-31</th>\n",
       "      <td>NaN</td>\n",
       "      <td>-1.070957</td>\n",
       "      <td>0.142398</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-28</th>\n",
       "      <td>-0.018856</td>\n",
       "      <td>-0.665106</td>\n",
       "      <td>-1.508780</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-03-31</th>\n",
       "      <td>NaN</td>\n",
       "      <td>-1.366486</td>\n",
       "      <td>NaN</td>\n",
       "      <td>-0.832033</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-04-30</th>\n",
       "      <td>NaN</td>\n",
       "      <td>-0.202303</td>\n",
       "      <td>-0.396425</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-31</th>\n",
       "      <td>NaN</td>\n",
       "      <td>0.029299</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-06-30</th>\n",
       "      <td>0.481797</td>\n",
       "      <td>0.432824</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-07-31</th>\n",
       "      <td>-1.690005</td>\n",
       "      <td>-0.064984</td>\n",
       "      <td>-0.313341</td>\n",
       "      <td>0.308628</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-08-31</th>\n",
       "      <td>NaN</td>\n",
       "      <td>-2.888206</td>\n",
       "      <td>-1.503279</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-09-30</th>\n",
       "      <td>NaN</td>\n",
       "      <td>-0.202785</td>\n",
       "      <td>-0.287089</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 No1       No2       No3       No4\n",
       "2019-01-31       NaN -1.070957  0.142398       NaN\n",
       "2019-02-28 -0.018856 -0.665106 -1.508780       NaN\n",
       "2019-03-31       NaN -1.366486       NaN -0.832033\n",
       "2019-04-30       NaN -0.202303 -0.396425       NaN\n",
       "2019-05-31       NaN  0.029299       NaN       NaN\n",
       "2019-06-30  0.481797  0.432824       NaN       NaN\n",
       "2019-07-31 -1.690005 -0.064984 -0.313341  0.308628\n",
       "2019-08-31       NaN -2.888206 -1.503279       NaN\n",
       "2019-09-30       NaN -0.202785 -0.287089       NaN"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# raises warning\n",
    "np.log(df)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "uuid": "9dfc1e40-c030-4a9c-9e3a-ff28c64a93df"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>No1</th>\n",
       "      <th>No2</th>\n",
       "      <th>No3</th>\n",
       "      <th>No4</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2019-01-31</th>\n",
       "      <td>1.322787</td>\n",
       "      <td>0.585389</td>\n",
       "      <td>1.073795</td>\n",
       "      <td>0.502430</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-28</th>\n",
       "      <td>0.990616</td>\n",
       "      <td>0.717091</td>\n",
       "      <td>0.470297</td>\n",
       "      <td>1.034429</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-03-31</th>\n",
       "      <td>0.435311</td>\n",
       "      <td>0.504977</td>\n",
       "      <td>0.676777</td>\n",
       "      <td>0.659669</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-04-30</th>\n",
       "      <td>0.763934</td>\n",
       "      <td>0.903796</td>\n",
       "      <td>0.820196</td>\n",
       "      <td>0.323127</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-31</th>\n",
       "      <td>0.728890</td>\n",
       "      <td>1.014757</td>\n",
       "      <td>0.661918</td>\n",
       "      <td>1.057506</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-06-30</th>\n",
       "      <td>1.272392</td>\n",
       "      <td>1.241614</td>\n",
       "      <td>0.501876</td>\n",
       "      <td>0.917843</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-07-31</th>\n",
       "      <td>0.429556</td>\n",
       "      <td>0.968030</td>\n",
       "      <td>0.854986</td>\n",
       "      <td>1.166857</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-08-31</th>\n",
       "      <td>0.571173</td>\n",
       "      <td>0.235958</td>\n",
       "      <td>0.471593</td>\n",
       "      <td>1.201340</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-09-30</th>\n",
       "      <td>0.869685</td>\n",
       "      <td>0.903578</td>\n",
       "      <td>0.866282</td>\n",
       "      <td>0.675238</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 No1       No2       No3       No4\n",
       "2019-01-31  1.322787  0.585389  1.073795  0.502430\n",
       "2019-02-28  0.990616  0.717091  0.470297  1.034429\n",
       "2019-03-31  0.435311  0.504977  0.676777  0.659669\n",
       "2019-04-30  0.763934  0.903796  0.820196  0.323127\n",
       "2019-05-31  0.728890  1.014757  0.661918  1.057506\n",
       "2019-06-30  1.272392  1.241614  0.501876  0.917843\n",
       "2019-07-31  0.429556  0.968030  0.854986  1.166857\n",
       "2019-08-31  0.571173  0.235958  0.471593  1.201340\n",
       "2019-09-30  0.869685  0.903578  0.866282  0.675238"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.sqrt(abs(df))  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {
    "uuid": "a540362b-50d7-4ef0-89ba-0b6ee38033f6"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "No1    7.384345\n",
       "No2    7.075190\n",
       "No3    6.397719\n",
       "No4    7.538440\n",
       "dtype: float64"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.sqrt(abs(df)).sum()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>No1</th>\n",
       "      <th>No2</th>\n",
       "      <th>No3</th>\n",
       "      <th>No4</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2019-01-31</th>\n",
       "      <td>-74.976547</td>\n",
       "      <td>134.268040</td>\n",
       "      <td>215.303580</td>\n",
       "      <td>74.756396</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-28</th>\n",
       "      <td>198.132079</td>\n",
       "      <td>151.421884</td>\n",
       "      <td>122.117967</td>\n",
       "      <td>-7.004333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-03-31</th>\n",
       "      <td>81.050417</td>\n",
       "      <td>125.500144</td>\n",
       "      <td>54.197301</td>\n",
       "      <td>143.516349</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-04-30</th>\n",
       "      <td>41.640495</td>\n",
       "      <td>181.684707</td>\n",
       "      <td>167.272081</td>\n",
       "      <td>89.558886</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-31</th>\n",
       "      <td>46.871962</td>\n",
       "      <td>202.973269</td>\n",
       "      <td>56.186438</td>\n",
       "      <td>-11.831825</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-06-30</th>\n",
       "      <td>261.898166</td>\n",
       "      <td>254.160517</td>\n",
       "      <td>74.812086</td>\n",
       "      <td>15.756426</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-07-31</th>\n",
       "      <td>118.451869</td>\n",
       "      <td>193.708220</td>\n",
       "      <td>173.100034</td>\n",
       "      <td>236.155613</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-08-31</th>\n",
       "      <td>67.376194</td>\n",
       "      <td>105.567601</td>\n",
       "      <td>122.239961</td>\n",
       "      <td>-44.321700</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-09-30</th>\n",
       "      <td>24.364769</td>\n",
       "      <td>181.645401</td>\n",
       "      <td>175.044476</td>\n",
       "      <td>54.405307</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                   No1         No2         No3         No4\n",
       "2019-01-31  -74.976547  134.268040  215.303580   74.756396\n",
       "2019-02-28  198.132079  151.421884  122.117967   -7.004333\n",
       "2019-03-31   81.050417  125.500144   54.197301  143.516349\n",
       "2019-04-30   41.640495  181.684707  167.272081   89.558886\n",
       "2019-05-31   46.871962  202.973269   56.186438  -11.831825\n",
       "2019-06-30  261.898166  254.160517   74.812086   15.756426\n",
       "2019-07-31  118.451869  193.708220  173.100034  236.155613\n",
       "2019-08-31   67.376194  105.567601  122.239961  -44.321700\n",
       "2019-09-30   24.364769  181.645401  175.044476   54.405307"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "100 * df + 100  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Basic Visualization"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [],
   "source": [
    "from pylab import plt, mpl  \n",
    "plt.style.use('seaborn')  \n",
    "mpl.rcParams['font.family'] = 'serif'  \n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {
    "uuid": "4b1834ec-9f9b-41d6-8d06-f2efc8433dc4"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df.cumsum().plot(lw=2.0, figsize=(10, 6));  \n",
    "# plt.savefig('../../images/ch05/pd_plot_01.png')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {
    "uuid": "4b1834ec-9f9b-41d6-8d06-f2efc8433dc4"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df.plot.bar(figsize=(10, 6), rot=30);  \n",
    "# df.plot(kind='bar', figsize=(10, 6))  \n",
    "# plt.savefig('../../images/ch05/pd_plot_02.png')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Series Class"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {
    "uuid": "e86f82d1-5934-42d3-a986-f01bc829adaa"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "pandas.core.frame.DataFrame"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [],
   "source": [
    "S = pd.Series(np.linspace(0, 15, 7), name='series')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0     0.0\n",
       "1     2.5\n",
       "2     5.0\n",
       "3     7.5\n",
       "4    10.0\n",
       "5    12.5\n",
       "6    15.0\n",
       "Name: series, dtype: float64"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "S"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "pandas.core.series.Series"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(S)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [],
   "source": [
    "s = df['No1']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2019-01-31   -1.749765\n",
       "2019-02-28    0.981321\n",
       "2019-03-31   -0.189496\n",
       "2019-04-30   -0.583595\n",
       "2019-05-31   -0.531280\n",
       "2019-06-30    1.618982\n",
       "2019-07-31    0.184519\n",
       "2019-08-31   -0.326238\n",
       "2019-09-30   -0.756352\n",
       "Freq: M, Name: No1, dtype: float64"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {
    "uuid": "ca241ef9-5359-4c89-bc92-be6346cb3959"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "pandas.core.series.Series"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(s)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-0.15021177307319458"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s.mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {
    "uuid": "b3d4cc90-e499-459c-88a5-011fde80d864"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "s.plot(lw=2.0, figsize=(10, 6));\n",
    "# plt.savefig('../../images/ch05/pd_plot_03.png')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## GroupBy Operations"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {
    "scrolled": true,
    "uuid": "4bc106dd-9590-4566-bc70-d410517c8223"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>No1</th>\n",
       "      <th>No2</th>\n",
       "      <th>No3</th>\n",
       "      <th>No4</th>\n",
       "      <th>Quarter</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2019-01-31</th>\n",
       "      <td>-1.749765</td>\n",
       "      <td>0.342680</td>\n",
       "      <td>1.153036</td>\n",
       "      <td>-0.252436</td>\n",
       "      <td>Q1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-28</th>\n",
       "      <td>0.981321</td>\n",
       "      <td>0.514219</td>\n",
       "      <td>0.221180</td>\n",
       "      <td>-1.070043</td>\n",
       "      <td>Q1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-03-31</th>\n",
       "      <td>-0.189496</td>\n",
       "      <td>0.255001</td>\n",
       "      <td>-0.458027</td>\n",
       "      <td>0.435163</td>\n",
       "      <td>Q1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-04-30</th>\n",
       "      <td>-0.583595</td>\n",
       "      <td>0.816847</td>\n",
       "      <td>0.672721</td>\n",
       "      <td>-0.104411</td>\n",
       "      <td>Q2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-31</th>\n",
       "      <td>-0.531280</td>\n",
       "      <td>1.029733</td>\n",
       "      <td>-0.438136</td>\n",
       "      <td>-1.118318</td>\n",
       "      <td>Q2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-06-30</th>\n",
       "      <td>1.618982</td>\n",
       "      <td>1.541605</td>\n",
       "      <td>-0.251879</td>\n",
       "      <td>-0.842436</td>\n",
       "      <td>Q2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-07-31</th>\n",
       "      <td>0.184519</td>\n",
       "      <td>0.937082</td>\n",
       "      <td>0.731000</td>\n",
       "      <td>1.361556</td>\n",
       "      <td>Q3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-08-31</th>\n",
       "      <td>-0.326238</td>\n",
       "      <td>0.055676</td>\n",
       "      <td>0.222400</td>\n",
       "      <td>-1.443217</td>\n",
       "      <td>Q3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-09-30</th>\n",
       "      <td>-0.756352</td>\n",
       "      <td>0.816454</td>\n",
       "      <td>0.750445</td>\n",
       "      <td>-0.455947</td>\n",
       "      <td>Q3</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 No1       No2       No3       No4 Quarter\n",
       "2019-01-31 -1.749765  0.342680  1.153036 -0.252436      Q1\n",
       "2019-02-28  0.981321  0.514219  0.221180 -1.070043      Q1\n",
       "2019-03-31 -0.189496  0.255001 -0.458027  0.435163      Q1\n",
       "2019-04-30 -0.583595  0.816847  0.672721 -0.104411      Q2\n",
       "2019-05-31 -0.531280  1.029733 -0.438136 -1.118318      Q2\n",
       "2019-06-30  1.618982  1.541605 -0.251879 -0.842436      Q2\n",
       "2019-07-31  0.184519  0.937082  0.731000  1.361556      Q3\n",
       "2019-08-31 -0.326238  0.055676  0.222400 -1.443217      Q3\n",
       "2019-09-30 -0.756352  0.816454  0.750445 -0.455947      Q3"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['Quarter'] = ['Q1', 'Q1', 'Q1', 'Q2', 'Q2',\n",
    "                 'Q2', 'Q3', 'Q3', 'Q3']\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [],
   "source": [
    "groups = df.groupby('Quarter')  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {
    "uuid": "a871b95e-5946-4b09-b8dc-bc9503d2ff14"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Quarter\n",
       "Q1    3\n",
       "Q2    3\n",
       "Q3    3\n",
       "dtype: int64"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "groups.size()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {
    "uuid": "804e567f-6b74-4405-a10e-d19d914655e7"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>No1</th>\n",
       "      <th>No2</th>\n",
       "      <th>No3</th>\n",
       "      <th>No4</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Quarter</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Q1</th>\n",
       "      <td>-0.319314</td>\n",
       "      <td>0.370634</td>\n",
       "      <td>0.305396</td>\n",
       "      <td>-0.295772</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Q2</th>\n",
       "      <td>0.168035</td>\n",
       "      <td>1.129395</td>\n",
       "      <td>-0.005765</td>\n",
       "      <td>-0.688388</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Q3</th>\n",
       "      <td>-0.299357</td>\n",
       "      <td>0.603071</td>\n",
       "      <td>0.567948</td>\n",
       "      <td>-0.179203</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              No1       No2       No3       No4\n",
       "Quarter                                        \n",
       "Q1      -0.319314  0.370634  0.305396 -0.295772\n",
       "Q2       0.168035  1.129395 -0.005765 -0.688388\n",
       "Q3      -0.299357  0.603071  0.567948 -0.179203"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "groups.mean()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {
    "uuid": "7eb45e5c-b86f-4464-afd9-d5a3665e0f8e"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>No1</th>\n",
       "      <th>No2</th>\n",
       "      <th>No3</th>\n",
       "      <th>No4</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Quarter</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Q1</th>\n",
       "      <td>0.981321</td>\n",
       "      <td>0.514219</td>\n",
       "      <td>1.153036</td>\n",
       "      <td>0.435163</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Q2</th>\n",
       "      <td>1.618982</td>\n",
       "      <td>1.541605</td>\n",
       "      <td>0.672721</td>\n",
       "      <td>-0.104411</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Q3</th>\n",
       "      <td>0.184519</td>\n",
       "      <td>0.937082</td>\n",
       "      <td>0.750445</td>\n",
       "      <td>1.361556</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              No1       No2       No3       No4\n",
       "Quarter                                        \n",
       "Q1       0.981321  0.514219  1.153036  0.435163\n",
       "Q2       1.618982  1.541605  0.672721 -0.104411\n",
       "Q3       0.184519  0.937082  0.750445  1.361556"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "groups.max()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead tr th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe thead tr:last-of-type th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th colspan=\"2\" halign=\"left\">No1</th>\n",
       "      <th colspan=\"2\" halign=\"left\">No2</th>\n",
       "      <th colspan=\"2\" halign=\"left\">No3</th>\n",
       "      <th colspan=\"2\" halign=\"left\">No4</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th>min</th>\n",
       "      <th>max</th>\n",
       "      <th>min</th>\n",
       "      <th>max</th>\n",
       "      <th>min</th>\n",
       "      <th>max</th>\n",
       "      <th>min</th>\n",
       "      <th>max</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Quarter</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Q1</th>\n",
       "      <td>-1.75</td>\n",
       "      <td>0.98</td>\n",
       "      <td>0.26</td>\n",
       "      <td>0.51</td>\n",
       "      <td>-0.46</td>\n",
       "      <td>1.15</td>\n",
       "      <td>-1.07</td>\n",
       "      <td>0.44</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Q2</th>\n",
       "      <td>-0.58</td>\n",
       "      <td>1.62</td>\n",
       "      <td>0.82</td>\n",
       "      <td>1.54</td>\n",
       "      <td>-0.44</td>\n",
       "      <td>0.67</td>\n",
       "      <td>-1.12</td>\n",
       "      <td>-0.10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Q3</th>\n",
       "      <td>-0.76</td>\n",
       "      <td>0.18</td>\n",
       "      <td>0.06</td>\n",
       "      <td>0.94</td>\n",
       "      <td>0.22</td>\n",
       "      <td>0.75</td>\n",
       "      <td>-1.44</td>\n",
       "      <td>1.36</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          No1         No2         No3         No4      \n",
       "          min   max   min   max   min   max   min   max\n",
       "Quarter                                                \n",
       "Q1      -1.75  0.98  0.26  0.51 -0.46  1.15 -1.07  0.44\n",
       "Q2      -0.58  1.62  0.82  1.54 -0.44  0.67 -1.12 -0.10\n",
       "Q3      -0.76  0.18  0.06  0.94  0.22  0.75 -1.44  1.36"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "groups.aggregate([min, max]).round(2)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {
    "uuid": "542cf99a-bbf8-447e-9643-d6887ac74be7"
   },
   "outputs": [],
   "source": [
    "df['Odd_Even'] = ['Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even',\n",
    "                  'Odd', 'Even', 'Odd']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {
    "uuid": "f5144c9f-ff37-4e35-9417-e39debdcd45b"
   },
   "outputs": [],
   "source": [
    "groups = df.groupby(['Quarter', 'Odd_Even'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {
    "uuid": "06904508-dbf1-431f-a3a2-681f29f03c51"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Quarter  Odd_Even\n",
       "Q1       Even        1\n",
       "         Odd         2\n",
       "Q2       Even        2\n",
       "         Odd         1\n",
       "Q3       Even        1\n",
       "         Odd         2\n",
       "dtype: int64"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "groups.size()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {
    "uuid": "b8471956-40fc-4203-a54a-aaa45f5a3c00"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead tr th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe thead tr:last-of-type th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th colspan=\"2\" halign=\"left\">No1</th>\n",
       "      <th colspan=\"2\" halign=\"left\">No4</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th>sum</th>\n",
       "      <th>mean</th>\n",
       "      <th>sum</th>\n",
       "      <th>mean</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Quarter</th>\n",
       "      <th>Odd_Even</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th rowspan=\"2\" valign=\"top\">Q1</th>\n",
       "      <th>Even</th>\n",
       "      <td>0.981321</td>\n",
       "      <td>0.981321</td>\n",
       "      <td>-1.070043</td>\n",
       "      <td>-1.070043</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Odd</th>\n",
       "      <td>-1.939261</td>\n",
       "      <td>-0.969631</td>\n",
       "      <td>0.182727</td>\n",
       "      <td>0.091364</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"2\" valign=\"top\">Q2</th>\n",
       "      <th>Even</th>\n",
       "      <td>1.035387</td>\n",
       "      <td>0.517693</td>\n",
       "      <td>-0.946847</td>\n",
       "      <td>-0.473423</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Odd</th>\n",
       "      <td>-0.531280</td>\n",
       "      <td>-0.531280</td>\n",
       "      <td>-1.118318</td>\n",
       "      <td>-1.118318</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"2\" valign=\"top\">Q3</th>\n",
       "      <th>Even</th>\n",
       "      <td>-0.326238</td>\n",
       "      <td>-0.326238</td>\n",
       "      <td>-1.443217</td>\n",
       "      <td>-1.443217</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Odd</th>\n",
       "      <td>-0.571834</td>\n",
       "      <td>-0.285917</td>\n",
       "      <td>0.905609</td>\n",
       "      <td>0.452805</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                       No1                 No4          \n",
       "                       sum      mean       sum      mean\n",
       "Quarter Odd_Even                                        \n",
       "Q1      Even      0.981321  0.981321 -1.070043 -1.070043\n",
       "        Odd      -1.939261 -0.969631  0.182727  0.091364\n",
       "Q2      Even      1.035387  0.517693 -0.946847 -0.473423\n",
       "        Odd      -0.531280 -0.531280 -1.118318 -1.118318\n",
       "Q3      Even     -0.326238 -0.326238 -1.443217 -1.443217\n",
       "        Odd      -0.571834 -0.285917  0.905609  0.452805"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "groups[['No1', 'No4']].aggregate([sum, np.mean])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Complex Selection"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = np.random.standard_normal((10, 2))  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.DataFrame(data, columns=['x', 'y'])  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 10 entries, 0 to 9\n",
      "Data columns (total 2 columns):\n",
      " #   Column  Non-Null Count  Dtype  \n",
      "---  ------  --------------  -----  \n",
      " 0   x       10 non-null     float64\n",
      " 1   y       10 non-null     float64\n",
      "dtypes: float64(2)\n",
      "memory usage: 288.0 bytes\n"
     ]
    }
   ],
   "source": [
    "df.info()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.189622</td>\n",
       "      <td>-1.690617</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-1.356399</td>\n",
       "      <td>-1.232435</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.544439</td>\n",
       "      <td>-0.668172</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.007315</td>\n",
       "      <td>-0.612939</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.299748</td>\n",
       "      <td>-1.733096</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          x         y\n",
       "0  1.189622 -1.690617\n",
       "1 -1.356399 -1.232435\n",
       "2 -0.544439 -0.668172\n",
       "3  0.007315 -0.612939\n",
       "4  1.299748 -1.733096"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>-0.983310</td>\n",
       "      <td>0.357508</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>-1.613579</td>\n",
       "      <td>1.470714</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>-1.188018</td>\n",
       "      <td>-0.549746</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>-0.940046</td>\n",
       "      <td>-0.827932</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>0.108863</td>\n",
       "      <td>0.507810</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          x         y\n",
       "5 -0.983310  0.357508\n",
       "6 -1.613579  1.470714\n",
       "7 -1.188018 -0.549746\n",
       "8 -0.940046 -0.827932\n",
       "9  0.108863  0.507810"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.tail()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0     True\n",
       "1    False\n",
       "2    False\n",
       "3    False\n",
       "4     True\n",
       "5    False\n",
       "6    False\n",
       "7    False\n",
       "8    False\n",
       "9    False\n",
       "Name: x, dtype: bool"
      ]
     },
     "execution_count": 79,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['x'] > 0.5  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0     True\n",
       "1    False\n",
       "2    False\n",
       "3     True\n",
       "4     True\n",
       "5    False\n",
       "6    False\n",
       "7    False\n",
       "8    False\n",
       "9    False\n",
       "dtype: bool"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(df['x'] > 0) & (df['y'] < 0)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0     True\n",
       "1     True\n",
       "2     True\n",
       "3     True\n",
       "4     True\n",
       "5    False\n",
       "6    False\n",
       "7     True\n",
       "8     True\n",
       "9     True\n",
       "dtype: bool"
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(df['x'] > 0) | (df['y'] < 0)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.189622</td>\n",
       "      <td>-1.690617</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.007315</td>\n",
       "      <td>-0.612939</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.299748</td>\n",
       "      <td>-1.733096</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>0.108863</td>\n",
       "      <td>0.507810</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          x         y\n",
       "0  1.189622 -1.690617\n",
       "3  0.007315 -0.612939\n",
       "4  1.299748 -1.733096\n",
       "9  0.108863  0.507810"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[df['x'] > 0]  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.189622</td>\n",
       "      <td>-1.690617</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.007315</td>\n",
       "      <td>-0.612939</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.299748</td>\n",
       "      <td>-1.733096</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>0.108863</td>\n",
       "      <td>0.507810</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          x         y\n",
       "0  1.189622 -1.690617\n",
       "3  0.007315 -0.612939\n",
       "4  1.299748 -1.733096\n",
       "9  0.108863  0.507810"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.query('x > 0')  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.189622</td>\n",
       "      <td>-1.690617</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.007315</td>\n",
       "      <td>-0.612939</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.299748</td>\n",
       "      <td>-1.733096</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          x         y\n",
       "0  1.189622 -1.690617\n",
       "3  0.007315 -0.612939\n",
       "4  1.299748 -1.733096"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[(df['x'] > 0) & (df['y'] < 0)]  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.189622</td>\n",
       "      <td>-1.690617</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.007315</td>\n",
       "      <td>-0.612939</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.299748</td>\n",
       "      <td>-1.733096</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          x         y\n",
       "0  1.189622 -1.690617\n",
       "3  0.007315 -0.612939\n",
       "4  1.299748 -1.733096"
      ]
     },
     "execution_count": 85,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.query('x > 0 & y < 0')  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.189622</td>\n",
       "      <td>-1.690617</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-1.356399</td>\n",
       "      <td>-1.232435</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.544439</td>\n",
       "      <td>-0.668172</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.007315</td>\n",
       "      <td>-0.612939</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.299748</td>\n",
       "      <td>-1.733096</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>-1.188018</td>\n",
       "      <td>-0.549746</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>-0.940046</td>\n",
       "      <td>-0.827932</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>0.108863</td>\n",
       "      <td>0.507810</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          x         y\n",
       "0  1.189622 -1.690617\n",
       "1 -1.356399 -1.232435\n",
       "2 -0.544439 -0.668172\n",
       "3  0.007315 -0.612939\n",
       "4  1.299748 -1.733096\n",
       "7 -1.188018 -0.549746\n",
       "8 -0.940046 -0.827932\n",
       "9  0.108863  0.507810"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[(df.x > 0) | (df.y < 0)]  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       x      y\n",
       "0   True  False\n",
       "1  False  False\n",
       "2  False  False\n",
       "3   True  False\n",
       "4   True  False\n",
       "5  False   True\n",
       "6  False   True\n",
       "7  False  False\n",
       "8  False  False\n",
       "9   True   True"
      ]
     },
     "execution_count": 87,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df > 0  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.189622</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.007315</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.299748</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>NaN</td>\n",
       "      <td>0.357508</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>NaN</td>\n",
       "      <td>1.470714</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>0.108863</td>\n",
       "      <td>0.507810</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          x         y\n",
       "0  1.189622       NaN\n",
       "1       NaN       NaN\n",
       "2       NaN       NaN\n",
       "3  0.007315       NaN\n",
       "4  1.299748       NaN\n",
       "5       NaN  0.357508\n",
       "6       NaN  1.470714\n",
       "7       NaN       NaN\n",
       "8       NaN       NaN\n",
       "9  0.108863  0.507810"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[df > 0]  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Concatenation, Joining and Merging"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [],
   "source": [
    "df1 = pd.DataFrame(['100', '200', '300', '400'], \n",
    "                    index=['a', 'b', 'c', 'd'],\n",
    "                    columns=['A',])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>300</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>400</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A\n",
       "a  100\n",
       "b  200\n",
       "c  300\n",
       "d  400"
      ]
     },
     "execution_count": 90,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [],
   "source": [
    "df2 = pd.DataFrame(['200', '150', '50'], \n",
    "                    index=['f', 'b', 'd'],\n",
    "                    columns=['B',])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     B\n",
       "f  200\n",
       "b  150\n",
       "d   50"
      ]
     },
     "execution_count": 92,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Concatenation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>200</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>300</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>400</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>NaN</td>\n",
       "      <td>200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>NaN</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>NaN</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B\n",
       "a  100  NaN\n",
       "b  200  NaN\n",
       "c  300  NaN\n",
       "d  400  NaN\n",
       "f  NaN  200\n",
       "b  NaN  150\n",
       "d  NaN   50"
      ]
     },
     "execution_count": 93,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.append(df2, sort=False)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>200</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>300</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>400</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>NaN</td>\n",
       "      <td>200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>NaN</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>NaN</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B\n",
       "0  100  NaN\n",
       "1  200  NaN\n",
       "2  300  NaN\n",
       "3  400  NaN\n",
       "4  NaN  200\n",
       "5  NaN  150\n",
       "6  NaN   50"
      ]
     },
     "execution_count": 94,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.append(df2, ignore_index=True, sort=False)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>200</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>300</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>400</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>NaN</td>\n",
       "      <td>200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>NaN</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>NaN</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B\n",
       "a  100  NaN\n",
       "b  200  NaN\n",
       "c  300  NaN\n",
       "d  400  NaN\n",
       "f  NaN  200\n",
       "b  NaN  150\n",
       "d  NaN   50"
      ]
     },
     "execution_count": 95,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.concat((df1, df2), sort=False)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>200</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>300</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>400</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>NaN</td>\n",
       "      <td>200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>NaN</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>NaN</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B\n",
       "0  100  NaN\n",
       "1  200  NaN\n",
       "2  300  NaN\n",
       "3  400  NaN\n",
       "4  NaN  200\n",
       "5  NaN  150\n",
       "6  NaN   50"
      ]
     },
     "execution_count": 96,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.concat((df1, df2), ignore_index=True, sort=False)  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Joining"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>200</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>300</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>400</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B\n",
       "a  100  NaN\n",
       "b  200  150\n",
       "c  300  NaN\n",
       "d  400   50"
      ]
     },
     "execution_count": 97,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.join(df2)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>B</th>\n",
       "      <th>A</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>200</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>150</td>\n",
       "      <td>200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>50</td>\n",
       "      <td>400</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     B    A\n",
       "f  200  NaN\n",
       "b  150  200\n",
       "d   50  400"
      ]
     },
     "execution_count": 98,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df2.join(df1)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>200</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>300</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>400</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B\n",
       "a  100  NaN\n",
       "b  200  150\n",
       "c  300  NaN\n",
       "d  400   50"
      ]
     },
     "execution_count": 99,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.join(df2, how='left')  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>NaN</td>\n",
       "      <td>200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>200</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>400</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B\n",
       "f  NaN  200\n",
       "b  200  150\n",
       "d  400   50"
      ]
     },
     "execution_count": 100,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.join(df2, how='right')  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>200</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>400</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B\n",
       "b  200  150\n",
       "d  400   50"
      ]
     },
     "execution_count": 101,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.join(df2, how='inner')  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>200</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>300</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>400</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>NaN</td>\n",
       "      <td>200</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B\n",
       "a  100  NaN\n",
       "b  200  150\n",
       "c  300  NaN\n",
       "d  400   50\n",
       "f  NaN  200"
      ]
     },
     "execution_count": 102,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.join(df2, how='outer')  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.DataFrame()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {},
   "outputs": [],
   "source": [
    "df['A'] = df1['A']  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>300</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>400</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A\n",
       "a  100\n",
       "b  200\n",
       "c  300\n",
       "d  400"
      ]
     },
     "execution_count": 105,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {},
   "outputs": [],
   "source": [
    "df['B'] = df2  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>200</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>300</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>400</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B\n",
       "a  100  NaN\n",
       "b  200  150\n",
       "c  300  NaN\n",
       "d  400   50"
      ]
     },
     "execution_count": 107,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.DataFrame({'A': df1['A'], 'B': df2['B']})  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>200</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>300</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>400</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>NaN</td>\n",
       "      <td>200</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B\n",
       "a  100  NaN\n",
       "b  200  150\n",
       "c  300  NaN\n",
       "d  400   50\n",
       "f  NaN  200"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Merging"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {},
   "outputs": [],
   "source": [
    "c = pd.Series([250, 150, 50], index=['b', 'd', 'c'])\n",
    "df1['C'] = c\n",
    "df2['C'] = c"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>200</td>\n",
       "      <td>250.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>300</td>\n",
       "      <td>50.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>400</td>\n",
       "      <td>150.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A      C\n",
       "a  100    NaN\n",
       "b  200  250.0\n",
       "c  300   50.0\n",
       "d  400  150.0"
      ]
     },
     "execution_count": 111,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>200</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>150</td>\n",
       "      <td>250.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>50</td>\n",
       "      <td>150.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     B      C\n",
       "f  200    NaN\n",
       "b  150  250.0\n",
       "d   50  150.0"
      ]
     },
     "execution_count": 112,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>C</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "      <td>200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>200</td>\n",
       "      <td>250.0</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>400</td>\n",
       "      <td>150.0</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A      C    B\n",
       "0  100    NaN  200\n",
       "1  200  250.0  150\n",
       "2  400  150.0   50"
      ]
     },
     "execution_count": 113,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.merge(df1, df2)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>C</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "      <td>200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>200</td>\n",
       "      <td>250.0</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>400</td>\n",
       "      <td>150.0</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A      C    B\n",
       "0  100    NaN  200\n",
       "1  200  250.0  150\n",
       "2  400  150.0   50"
      ]
     },
     "execution_count": 114,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.merge(df1, df2, on='C')  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>C</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "      <td>200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>200</td>\n",
       "      <td>250.0</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>300</td>\n",
       "      <td>50.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>400</td>\n",
       "      <td>150.0</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A      C    B\n",
       "0  100    NaN  200\n",
       "1  200  250.0  150\n",
       "2  300   50.0  NaN\n",
       "3  400  150.0   50"
      ]
     },
     "execution_count": 115,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.merge(df1, df2, how='outer')  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>C_x</th>\n",
       "      <th>B</th>\n",
       "      <th>C_y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>200</td>\n",
       "      <td>250.0</td>\n",
       "      <td>200</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    C_x    B  C_y\n",
       "0  200  250.0  200  NaN"
      ]
     },
     "execution_count": 116,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.merge(df1, df2, left_on='A', right_on='B')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>C_x</th>\n",
       "      <th>B</th>\n",
       "      <th>C_y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>200</td>\n",
       "      <td>250.0</td>\n",
       "      <td>200</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>300</td>\n",
       "      <td>50.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>400</td>\n",
       "      <td>150.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>150</td>\n",
       "      <td>250.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>50</td>\n",
       "      <td>150.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    C_x    B    C_y\n",
       "0  100    NaN  NaN    NaN\n",
       "1  200  250.0  200    NaN\n",
       "2  300   50.0  NaN    NaN\n",
       "3  400  150.0  NaN    NaN\n",
       "4  NaN    NaN  150  250.0\n",
       "5  NaN    NaN   50  150.0"
      ]
     },
     "execution_count": 117,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.merge(df1, df2, left_on='A', right_on='B', how='outer')  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>C_x</th>\n",
       "      <th>B</th>\n",
       "      <th>C_y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>200</td>\n",
       "      <td>250.0</td>\n",
       "      <td>150</td>\n",
       "      <td>250.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>400</td>\n",
       "      <td>150.0</td>\n",
       "      <td>50</td>\n",
       "      <td>150.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    C_x    B    C_y\n",
       "b  200  250.0  150  250.0\n",
       "d  400  150.0   50  150.0"
      ]
     },
     "execution_count": 118,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.merge(df1, df2, left_index=True, right_index=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>C</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "      <td>200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>200</td>\n",
       "      <td>250.0</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>400</td>\n",
       "      <td>150.0</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A      C    B\n",
       "f  100    NaN  200\n",
       "b  200  250.0  150\n",
       "d  400  150.0   50"
      ]
     },
     "execution_count": 119,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.merge(df1, df2, on='C', left_index=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>C</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "      <td>200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>200</td>\n",
       "      <td>250.0</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>400</td>\n",
       "      <td>150.0</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A      C    B\n",
       "a  100    NaN  200\n",
       "b  200  250.0  150\n",
       "d  400  150.0   50"
      ]
     },
     "execution_count": 120,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.merge(df1, df2, on='C', right_index=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>C</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>200</td>\n",
       "      <td>250.0</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>400</td>\n",
       "      <td>150.0</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A      C    B\n",
       "b  200  250.0  150\n",
       "d  400  150.0   50"
      ]
     },
     "execution_count": 121,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.merge(df1, df2, on='C', left_index=True, right_index=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Performance Aspects"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = np.random.standard_normal((1000000, 2))  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "16000000"
      ]
     },
     "execution_count": 123,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.nbytes  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.DataFrame(data, columns=['x', 'y'])  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 1000000 entries, 0 to 999999\n",
      "Data columns (total 2 columns):\n",
      " #   Column  Non-Null Count    Dtype  \n",
      "---  ------  --------------    -----  \n",
      " 0   x       1000000 non-null  float64\n",
      " 1   y       1000000 non-null  float64\n",
      "dtypes: float64(2)\n",
      "memory usage: 15.3 MB\n"
     ]
    }
   ],
   "source": [
    "df.info()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 10.5 ms, sys: 14.9 ms, total: 25.4 ms\n",
      "Wall time: 6.78 ms\n"
     ]
    }
   ],
   "source": [
    "%time res = df['x'] + df['y']  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    0.387242\n",
       "1   -0.969343\n",
       "2   -0.863159\n",
       "dtype: float64"
      ]
     },
     "execution_count": 127,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "res[:3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 55.5 ms, sys: 19.5 ms, total: 75 ms\n",
      "Wall time: 73.6 ms\n"
     ]
    }
   ],
   "source": [
    "%time res = df.sum(axis=1)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    0.387242\n",
       "1   -0.969343\n",
       "2   -0.863159\n",
       "dtype: float64"
      ]
     },
     "execution_count": 129,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "res[:3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 21 ms, sys: 2.25 ms, total: 23.2 ms\n",
      "Wall time: 20.6 ms\n"
     ]
    }
   ],
   "source": [
    "%time res = df.values.sum(axis=1)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.3872424 , -0.96934273, -0.86315944])"
      ]
     },
     "execution_count": 131,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "res[:3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 51.9 ms, sys: 11.2 ms, total: 63.1 ms\n",
      "Wall time: 60.6 ms\n"
     ]
    }
   ],
   "source": [
    "%time res = np.sum(df, axis=1)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    0.387242\n",
       "1   -0.969343\n",
       "2   -0.863159\n",
       "dtype: float64"
      ]
     },
     "execution_count": 133,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "res[:3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 20.5 ms, sys: 1.48 ms, total: 22 ms\n",
      "Wall time: 20 ms\n"
     ]
    }
   ],
   "source": [
    "%time res = np.sum(df.values, axis=1)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.3872424 , -0.96934273, -0.86315944])"
      ]
     },
     "execution_count": 135,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "res[:3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 12 ms, sys: 16.9 ms, total: 28.9 ms\n",
      "Wall time: 11.8 ms\n"
     ]
    }
   ],
   "source": [
    "%time res = df.eval('x + y')  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    0.387242\n",
       "1   -0.969343\n",
       "2   -0.863159\n",
       "dtype: float64"
      ]
     },
     "execution_count": 137,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "res[:3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 26.8 s, sys: 109 ms, total: 26.9 s\n",
      "Wall time: 27 s\n"
     ]
    }
   ],
   "source": [
    "%time res = df.apply(lambda row: row['x'] + row['y'], axis=1)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    0.387242\n",
       "1   -0.969343\n",
       "2   -0.863159\n",
       "dtype: float64"
      ]
     },
     "execution_count": 139,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "res[:3]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\"http://hilpisch.com/tpq_logo.png\" alt=\"The Python Quants\" width=\"35%\" align=\"right\" border=\"0\"><br>\n",
    "\n",
    "<a href=\"http://tpq.io\" target=\"_blank\">http://tpq.io</a> | <a href=\"http://twitter.com/dyjh\" target=\"_blank\">@dyjh</a> | <a href=\"mailto:training@tpq.io\">training@tpq.io</a>"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
